Process Analysis Toolkit  (PAT) 3.5 Help  
3.6.1.3 Grammar Rules

      Declaration
            : (specBody)*

      ;

 

specBody 
           : library
           | letDefintion  

     | assertion 
           | define
           | channel

     | definition 
           ;

 

library 
           : '#' 'import' STRING ';'  //import the library by full dll path or DLL name under the Lib folder

     ; 

 

letDefintion

           : 'var' ID ('<' datatype=ID '>')? variableRange? ('=' expression)? ';'  //user defined datatype is supported using <type>

           | 'var' ID variableRange? '=' recordExpression ';'

           | 'var' ID ('[' expression ']')+ variableRange? ('=' recordExpression)? ';'  //multi-dimensional array is supported

           | ('clock') ID ('[' expression ']')? ';'
                 ;

 

variableRange

            :':' '{' additiveExpression?'..' additiveExpression? '}'

           ;

recordExpression

            : '[' recordElement (','recordElement)* ']'

           ;

recordElement

           : e1=expression ('(' e2=expression ')')?

           | e1=expression '..' e2=expression

            ;

 

assertion

           : '#' 'assert' definitionRef            

           (

                       ( '|=' ( '(' | ')' | '[]' | '<>' | ID | STRING | '!' | '?' | '&&' | '||' | '->' | '<->' | '/\\' | '\\/' | '.' | INT )+ )

                                   | 'deadlockfree'  

                                   | 'nonterminating'

                                   | 'divergencefree'

                                   | 'deterministic'

                                   | 'reaches' ID withClause

                                   |  'refines' definitionRef

                                   |  'refines' '<F>' definitionRef

                                   | 'refines' '<FD>' definitionRef

            )

            ';'

           ;

withClause

        : 'with' ('min' | 'max') '(' expression ')'
              ;

 

definitionRef

           : ID ('('  ')')?

           ;    

      

define : '#' 'define' ID INT ';'

           | '#' 'define' ID ('true' | 'false') ';'

           | 'enum'  '{' ID (',' ID)*  '}'  ';'

           | '#' 'define' ID conditionalOrExpression ';'

                     

 

block :  '{' statement* expression? '}'

           ;

 

statement

           : block

           | localVariableDeclaration

           | ifExpression

           | whileExpression

           | expression ';'

           | ';'

           ;


     localVariableDeclaration  
            : 'var' ID ('=' expression)? ';' 

      | 'var' ID '=' recordExpression ';' 

       ;

   

expression

           : conditionalOrExpression ('=' expression)?

           ;

           

conditionalOrExpression

          : conditionalAndExpression ( '||' conditionalAndExpression )*

       

conditionalAndExpression

           : equalityExpression ( '&&' equalityExpression)*

           ;

 

equalityExpression

            : relationalExpression( ('==' | '!=') relationalExpression)*

            ;

           

relationalExpression

           : additiveExpression ( ('<' | '>' | '<=' | '>=') additiveExpression)*

            ;

           

additiveExpression

           : multiplicativeExpression ( ('+' | '-') multiplicativeExpression)*

           ;

 

multiplicativeExpression

           : unaryExpression ( ('*' | '/' | '%' ) unaryExpression)*

           ;

 

unaryExpression

           : '+' unaryExpression

           | '-' unaryExpression

           | '!' unaryExpressionNotPlusMinus            

           | unaryExpressionNotPlusMinus '++'       

           | unaryExpressionNotPlusMinus '--'            

           | unaryExpressionNotPlusMinus

           ;

 

unaryExpressionNotPlusMinus 

           : INT

           | 'true'

           | 'false'

           | 'call' '(' ID (',' conditionalOrExpression)* ')' 

           | new ID '(' (conditionalOrExpression ',' conditionalOrExpression)*)? ')'  

           | ID '.' ID '(' (conditionalOrExpression ',' conditionalOrExpression)*)? ')' 

           | arrayExpression '.' ID '(' (conditionalOrExpression (',' conditionalOrExpression)*)? ')'

           | arrayExpression

           | '(' conditionalOrExpression ')'

           | ID

           ;

 

arrayExpression

          : ID ('[' conditionalOrExpression ']')+

          ;

ifExpression

           : 'if' '(' expression ')' statement ('else' statement)? 

           ;

           

whileExpression

           : 'while' '(' expression ')' statement

            ;

channel
              : 'channel' ID ('[' expression ']')? ';'

        ;

 

definition 
              :  ID  '=' interleaveExpr ';' 

        | 'Process' STRING  ('(' (ID (',' ID )*)? ')')?  '[' STRING ']' ':'  stateDef+ transition* ';'  

        ;

 

stateDef 
            : 'State:' STRING clockConstraints? '[U]'? '[C]'? 

      ;

 

transition 
           : STRING '--' select? clockConstraints? ('[' conditionalOrExpression ']')? '##@@' eventM '@@##' (block)? 

       clockRestExpression?  '-->' STRING

     ;

 

interleaveExpr 
           : indexedInterleave ( ('|||' indexedInterleave)+)

     ;

 

indexedInterleave

    : atom
          | '|||' (paralDef (';' paralDef )*) '@' atom 

    | '('! indexedInterleave ')'
          ; 

 

paralDef
         : ID ':' '{' additiveExpression (',' additiveExpression)*  '}' 

   | ID ':' '{' additiveExpression '..' additiveExpression  '}' 

   ;    
     

select
        : 'select' ':' (paralDef (';' paralDef )*)  

  ;  

 

clockConstraints
         : 'clocks' ':' '<' clockConstraint ('&&' clockConstraint)* '>' 
         ;

 

clockConstraint
         : additiveExpression ('<='|'<'|'=='|'>'|'>=') additiveExpression
         ; 
     

clockRestExpression
        : 'clockreset' ':' unaryExpressionNotPlusMinus (',' unaryExpressionNotPlusMinus )*  

  ; 

         

atom
        :  ID  ('(' (expression (',' expression )*)?  ')')?  

  ;

 

eventM
        :  ID ( '.' additiveExpression)* 

  | 'tau' 

  | ID '!' 

  | ID '?'  

  ;

ID      

 : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*

 ;

STRING
        :  '"' (~('"') )* '"'
        ;

 

WS 

  : (' '|'\r'|'\t'|'\u000C'|'\n')

  ;   

 

INT

  : ('0'..'9')+

  ;

 

COMMENT
         :   '/*' ( : . )* '*/'    

   ;

 

LINE_COMMENT
         : '//' ~('\n'|'\r')* '\r'? '\n' 
         ;

 


 
Copyright © 2007-2012 Semantic Engineering Pte. Ltd.